
package app;

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

/**
 * Klasa dziedzicząca po klasie Sprite. Odzwierciedla auto i jego zachowanie.
 * Zawiera statystyki sterowania autem oraz jego wygląd.
 * @author morohusky
 */
public class Car extends Sprite {
    private static final String IMAGE_PATH_FORMAT = "/imgs/%s.png";
    private final  Image _defaultCar;
    private BufferedImage _car;
    private final JLabel _lbl;
    
    
    /**
     * Konstruktor parametryczny
     * @param name Nazwa pliku z obrazkiem auta
     * @param controls Przyciski sterujące autem
     */
    public Car(String name, Key[] controls) {
        //super(new SpriteStats(5.0d, -2.5d, 12.5d, 0.2d, 0.15d, 0.05d), controls);
        super(new SpriteStats(5.0d, -2.5d, 12.5d, 1.3d, 0.08d, 0.05d), controls);
        
        _defaultCar = (new ImageIcon(getClass().getResource(String.format(IMAGE_PATH_FORMAT, name)))).getImage();
        _car = new BufferedImage(_defaultCar.getWidth(null), _defaultCar.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR);
        _car.getGraphics().drawImage(_defaultCar, 0, 0, null);
        _lbl = new JLabel(new ImageIcon(_defaultCar));
        _lbl.setSize(_car.getWidth(), _car.getHeight());
        _lbl.setDoubleBuffered(true);
    }
    
    
    /**
     * "Getter" ikony auta
     * @return Ikona auta
     */
    public JLabel getLabel() {
        return _lbl;
    }
    
    /**
     * "Getter" szerokości auta
     * @return Szerokość auta
     */
    public int getWidth() {
        return _car.getWidth();
    }
    
    /**
     * "Getter" długości auta
     * @return Długość auta
     */
    public int getHeight() {
        return _car.getHeight();
    }
    
    /**
     * "Getter" pozycji na osi x
     * @return Pozycja auta
     */
    public int getX() {
        return _lbl.getX();
    }
    
    /**
     * "Getter" pozycji na osi y
     * @return Pozycja auta
     */
    public int getY() {
        return _lbl.getY();
    }
    
    /**
     * "Getter" położenia środka auta
     * @return Punkt w jakim położony jest środek auta
     */
    public Point getMidPoint() {
        return new Point(_lbl.getX() + (_car.getWidth() / 2), _lbl.getY() + (_car.getHeight() / 2));
    }
    
    /**
     * "Getter" pozycji ikony auta
     * @return Pozycja lewego-górnego rogu ikony auta
     */
    public Point getLocation() {
        return _lbl.getLocation();
    }
    
    /**
     * Ustawienie położenia auta
     * @param x Położenie na osi x
     * @param y Położenie na osi y
     */
    public void setLocation(int x, int y) {
        _posX = x;
        _posY = y;
        _lbl.setLocation(x, y);
    }
    
    /**
     * Ustawienie położenia auta
     * @param x Położenie na osi x
     * @param y Położenie na osi y
     */
    public void setLocation(double x, double y) {
        _posX = x;
        _posY = y;
        _lbl.setLocation((int)x, (int)y);
    }
    
    
    @Override
    protected void rotate(double angle) {
        _car = new BufferedImage(_defaultCar.getWidth(null), _defaultCar.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR);
        Graphics2D gr = (Graphics2D)_car.getGraphics();
        gr.rotate(Math.toRadians(angle), _car.getWidth() * 0.5d, _car.getHeight() * 0.5d);
        gr.drawImage(_defaultCar, 0, 0, _defaultCar.getWidth(null), _defaultCar.getHeight(null), null);
        
        _lbl.setIcon(new ImageIcon(_car));
    }
    
    @Override
    public void move(double fps) {
        super.move(fps);
        _lbl.setLocation((int)_posX, (int)_posY);
    }
    
}
